Обход (перечисление) компонентов может понадобиться по разным причинам. Например, для назначения атрибутов компонентам или для чтения каких-то атрибутов. Может быть для составления отчета или перечня. Рассмотрим обход компонентов сборки в NXOpen.
Обход компонентов сборки в NXOpen: Код
Подобная задача рассматривается в пособии Getting Started with NXOpen (стр.87). Однако, там рассмотрен обход всех компонентов сборки, включая вложенные, при помощи рекурсии и вспомогательной функции вывода на экран Guide.InfoWriteLine(), которой нет в NX10. Кроме того, не на С#, а на Visual Basic, который впрочем, кроме синтаксиса ничем от C# не отличается. В конце статьи рассмотрим ещё один важный момент, связанный с реализацией сложных алгоритмов обработки компонентов при обходе. Обо всем по порядку.
Код обхода компонентов первого уровня сборки таков:
using System; using NXOpen; public partial class NXJournal { // Информационное окно. static ListingWindow lw; //Основная рабочая функция журнала. public static void Main(string[] args) { NXOpen.Session theSession = Session.GetSession(); NXOpen.Part workPart = theSession.Parts.Work; NXOpen.Part displayPart = theSession.Parts.Display; // Конструктор и конфигурация объекта для поля окна вывода lw. lw = theSession.ListingWindow; String outputFile = @"C:\Users\user\Desktop\nxTest.txt"; lw.SelectDevice(ListingWindow.DeviceType.FileAndWindow, outputFile); lw.Open(); // Вызов перечисления компонентов сборки (отображаемой детали). AssemblyList(displayPart); // Освобождение информационного окна. lw.Close(); lw.SelectDevice(ListingWindow.DeviceType.Window, ""); } //Вывод списка компонентов сборки и их типа в информационное окно NX. public static void AssemblyList(Part inputPart) { // Взять имя детали целевой сборки. Вывести его в информационное окно. String inputPartName = System.IO.Path.GetFileNameWithoutExtension(inputPart.FullPath); lw.WriteLine(inputPartName); // Создать массив компонентов из всех потомков первого уровня у целевой сборки. NXOpen.Assemblies.Component[] allComps = inputPart. ComponentAssembly.RootComponent.GetChildren(); // Для каждого потомка вывести имя в информационное окно. foreach (NXOpen.Assemblies.Component child in allComps) { String childName = System.IO.Path.GetFileNameWithoutExtension(child. Prototype.OwningPart.FullPath); lw.WriteLine(childName); } } public static int GetUnloadOption(string dummy) { return (int)Session.LibraryUnloadOption.Immediately; } }
Журнал или dll?
Есть разница между разработкой журнала и разработкой dll на NXOpen (в Visual Studio). При разработке журнала весь код должен быть в одном файле, т.к. при запуске мы выбираем лишь один файл. Если логика работы журнала сложная и требует создания дополнительных классов, то они конечно могут быть описаны в том же файле журнала, но это приведет к потере читабельности — файл станет очень большим. Кроме того, упомянутая сложная логика может потребовать для работы более продвинутых функций системы .Net, например Linq. В таких случаях, к проекту в Visual Studio может быть добавлена ссылка на dll. Над процессом компиляции журнала внутри NX пользователь не имеет такого контроля, как в Visual Studio. Поэтому сложные проекты, где классы распределяются по разным файлам и добавляются дополнительные ссылки, обычно реализуют не в виде журнала, а в виде скомпилированного приложения. Самым существенным недостатком разработки в Visual Studio является то, что для запуска dll нужна более продвинутая лицензия NX (dotnet_author), в то время как для запуска журнала никаких дополнительных лицензий не нужно.
Журнал запускается комбинацией «Alt+F8» (Меню — Инструменты журнал — Воспроизведение), нужно выбрать правильный тип файла, а dll запускается по «Ctrl+U» (Файл — Выполнить — NXOpen).